// pages/dahai/player.js
const app=getApp()
let pp, index, currentTime
Page({
	onHide(){ //页面进入后台
		this.save()
	},
	onUnload(){ //页面卸载
		this.save()
	},
	save(){ //缓存数据到本地
		if(!this.data.sources||this.hasSave)return
		let playMessage={ ...this.data,  currentTime } //播放信息
		delete playMessage.__webviewId__
		let data=pp.data //视频列表页面的页面数据
		let menu=data.menus[data.menuIndex] //获取当前菜单项
		let change={} //保存有变化的数据
		change[`menus[${data.menuIndex}].types[${menu.typeIndex}].list[${index}].playMessage`]=playMessage
		pp.setData(change,()=>{  //更新列表页面的点击播放的视频信息
			wx.setStorageSync(pp.key, pp.data)
			this.hasSave=true
		})
	},
	timeupdate(e){ //播放进度发生变化
		currentTime= e.detail.currentTime
	},
	error(e){ //若剧集播放失败，直接跳到下个源
		let si=this.data.sourceIndex
		this.setData({url:null},()=>{ //清空url，这样模拟点击源时会自动模拟点击播放第一集
			if(si<this.data.sources.length-1){
				this.sources({target:{dataset:{index:si+1}}}) //模拟点击下个源
			}
		})
	},
	sources(e){ //切换视频源
		let index=e.target.dataset.index //获取点击源的索引号
		if(index==null)return //没点中直接返回
		let oldIndex=this.data.sourceIndex //原来源的索引号
		let change={sourceIndex:index} //记录有变化的数据
		if(oldIndex!=null)change[`sources[${oldIndex}].selected`]=false //清除原来源的选中效果
		change[`sources[${index}].selected`]=true //设置新源的选中效果
		this.setData(change,()=>{ //更新界面显示，若尚未有正在播放的剧集，就模拟点击该源下的第一集
			this.hasSave=false
			if(this.data.url==null)this.play({target:{dataset:{index:0}}})
		})
	},
	async onLoad(e){
		index=parseInt(e.index) //获取要播放视频的索引号
		let pages=getCurrentPages() //获取页面栈
		pp=pages[pages.length-2] //获取视频列表页面
		let menuIndex=pp.data.menuIndex //当前菜单的索引号
		let menu=pp.data.menus[menuIndex] //当前菜单
		let type=menu.types[menu.typeIndex] //当前类型
		let video=type.list[index] //要播放的视频
		if(video.playMessage){ //有播放信息吗？
			this.setData(video.playMessage)
			return
		}
		//https://www.hbqcwk.com/voddetail/90511.html
		let url=`${pp.host}${video.url}` //视频播放页面的网址
		let html=await app.request({url}) //获取html
		let r, sources=[], regex=/>\s+([^<]+?)\s+<\/h3>\s+<\/div>\s+<\/div>\s+<div class="stui-pannel_bd col-pd clearfix">(.+?)<\/ul>/gs //获取视频源信息
		while(r=regex.exec(html)){
			let r2, list=[], re=/href="([^"]+)">([^<]+)/g
			while(r2=re.exec(r[2])){
				list.push({
					url: r2[1],
					title: r2[2],
				})
			}
			sources.push({
				name: r[1],
				list,
			})
		}
		regex=/剧情简介\s+<\/h3>\s+<\/div>\s+<\/div>\s+<div class="stui-pannel_bd">(.+?)<\/div>/s //获取简介的正则表达式
		let jj
		if(r=regex.exec(html))jj=r[1].replace(/(<\/?(p|br)[^>]*>|　)+/gs,'\n')
			.replace(/<[^>]*>/g,'')
			.replace(/\s*\n\s*/g,'\n　　')
			.replace(/^\n/g,'')
		this.setData({jj, sources, title:video.title}, ()=>{
			if(this.data.url==null)this.sources({target:{dataset:{index:0}}})
		})
	},
	async play(e){ //播放剧集
		let index=e.target.dataset.index //获取点击剧集的索引号
		if(index==null)return //没点中直接返回
		let si=this.data.sourceIndex //当前源的索引号
		let change={playSourceIndex: si} //只有在播放剧集时才会修改playSourceIndex
		change[`sources[${si}].listIndex`]=index
		change[`sources[${si}].list[${index}].selected`]=true //该剧集被选中，表示曾播放过
		let pi=this.data.playSourceIndex //正播放剧集所在源的索引号
		if(pi!=null && currentTime!=null){ //原来有播放的剧集，就先记录其播放的进度
			let oldListIndex=this.data.sources[pi].listIndex
			change[`sources[${pi}].list[${oldListIndex}].currentTime`]=currentTime
		}
		currentTime=null //表示尚未开始播放
		this.setData(change) //展示点击效果
		let source=this.data.sources[si] //获取当前源
		let video=source.list[index] //获取当前点击的剧集对象
		if(video.url.startsWith('/')){ //尚未获取真正的剧集地址
			// https://www.hbqcwk.com/vp/90511-1-1.html
			let html=await app.request({url:`${pp.host}${video.url}`}) //获取剧集播放页面的内容，准备从中获取剧集的地址
			let r, regex=/var player_aaaa=(.+?)<\/script>/g //剧集播放页面内有一段js代码，包含有视频地址
			change={}
			if(r=regex.exec(html)){
				let j=JSON.parse(r[1])
				change[`sources[${si}].list[${index}].url`]=j.url //设置点击视频的真正地址
				if(j.url_next)change[`sources[${si}].list[${index+1}].url`]=j.url_next //设置下一集的视频地址
				change.url=j.url //设置播放视频地址
				change.currentTime=0 //从头开始播放
			}
		}else{
			change={ url:video.url, currentTime:video.currentTime??0 } //若已有视频地址，则从原来的位置继续播放
		}
		this.hasSave=false
		this.setData(change) //开始播放
	},
})